package la.iok.hzsvn.lewin.movie.service;

import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.core.model.PlayRoleVo;
import la.iok.hzsvn.lewin.movie.entity.PlayRole;
import la.iok.hzsvn.lewin.movie.model.PlayRoleParam;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.Nullable;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

public interface PlayRoleService extends BaseService<PlayRole,Long> {
    /**
     * 保存角色
     * @param token 操作用户
     * @param movieId 剧本id
     * @param playRole 角色
     * @return 角色id
     */
    @NotNull
    Long save(@NotNull Token token, @NotNull Long movieId, @NotNull PlayRoleParam playRole);

    /**
     * 修改角色信息
     * @param token 操作用户
     * @param id 角色id
     * @param playRole 角色信息
     */
    void update(@NotNull Token token, @NotNull Long id, @NotNull PlayRoleParam playRole);

    /**
     * 上传角色文件
     * @param token 操作用户
     * @param id 角色id
     * @param path 角色文件在pc上的存储路径,相对于剧本根目录
     * @param file 文件
     */
    void uploadFile(@NotNull Token token, @NotNull Long id, @NotNull String path, @NotNull MultipartFile file);

    /**
     * 下载角色文件
     * @param token 操作用户
     * @param response 响应
     * @param id 角色id
     */
    void downloadFile(@NotNull Token token, @NotNull HttpServletResponse response, @NotNull Long id);
    /**
     * 删除角色
     * @param token 操作用户
     * @param id 角色id
     */
    void delete(@NotNull Token token, @NotNull Long id);
    /**
     * 查询剧本所有角色
     * @param movieId 剧本id
     * @return 角色列表
     */
    @NotNull
    @NotNullElement
    List<PlayRole> list(@Nullable Long movieId);

    /**
     * 剧本所有角色
     * @param token 操作用户
     * @param movieId 剧本id
     * @return 角色列表
     */
    @NotNull
    @NotNullElement
    List<PlayRoleVo> movieRoles(@NotNull Token token, @Nullable Long movieId);
    /**
     * 查找角色文件摘要
     * @param id 角色id
     * @return 角色文件摘要信息
     */
    @Nullable
    String digest(@Nullable Long id);
    /**
     * 查找角色文件存储路径
     * @param id 角色id
     * @return 角色文件存储路径
     */
    @Nullable
    String storePath(@Nullable Long id);
}
